package demo.designPattern;

// 1. 定义组件接口
interface Component {
    void operation();
}

/**
 * 装饰器模式（Decorator Pattern）是一种结构型设计模式，它允许你动态地将行为添加到对象中，而不改变其结构。
 * 装饰器模式通过创建一个装饰器类来包装原始类，从而在不修改原始类代码的情况下扩展其功能。
 * <p><br/>
 * 装饰器模式的核心思想：
 * <li>组件接口：定义一个抽象接口或抽象类，表示被装饰的对象。
 * <li>具体组件：实现组件接口的具体类，即被装饰的原始对象。
 * <li>装饰器类：实现组件接口，并持有一个组件对象的引用。装饰器类可以在调用组件对象的方法前后添加额外的行为。
 * <li>具体装饰器：继承或实现装饰器类，提供具体的装饰行为。
 */
public class DecoratorDemo {

    public static void main(String[] args) {
        // 创建具体组件
        Component component = new ConcreteComponent();

        // 使用装饰器A包装组件
        Component decoratedComponentA = new ConcreteDecoratorA(component);
        decoratedComponentA.operation();

        // 使用装饰器B包装组件
        Component decoratedComponentB = new ConcreteDecoratorB(component);
        decoratedComponentB.operation();

        // 使用装饰器A和B同时包装组件
        Component decoratedComponentAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
        decoratedComponentAB.operation();
    }
}

// 2. 具体组件
class ConcreteComponent implements Component {
    @Override
    public void operation() {
        System.out.println("ConcreteComponent: 执行操作");
    }
}

// 3. 装饰器抽象类
abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void operation() {
        component.operation();
    }
}

// 4. 具体装饰器A
class ConcreteDecoratorA extends Decorator {
    public ConcreteDecoratorA(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorA: 添加额外行为");
    }
}

// 5. 具体装饰器B
class ConcreteDecoratorB extends Decorator {
    public ConcreteDecoratorB(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecoratorB: 添加额外行为");
    }
}

